package com.Reporte_MasVendidos;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.ExecutionException;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.BarChart;
import org.achartengine.chart.BarChart.Type;
import org.achartengine.chart.LineChart;
import org.achartengine.model.SeriesSelection;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ActionBar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.BD.BD_RM;
import com.Generales.login;
import com.Reporte_Consultas.Registro_Consultas;
import com.Reporte_Consultas.Registro_Ventas;
import com.Reporte_Consultas.Reporte_Consultas;
import com.Reporte_Evolutivo.RE_1_Tipo_Eventos;
import com.Reporte_Venta.VentasGenerales;
import com.Generales.R;
import com.JSON.JSONParser_Final;

public class Reporte_MasVendidos extends Activity {

	//#### BD #####
	private static String urlMasVendidos = "http://200.16.7.112:3000/reports_management/report/masvendidos/";
	private BD_RM db = null;
	private JSONArray auxJsonVentas = null;
	
	
	//### Graficar ###/
	GraphicalView mChartView = null;
	int[] anios = null;
	int[] meses = null;
	int[] ventasAnio = null;
	int[] ventasMes = null;
	String[] datos = null;
	String tituloGrafica = "";
	LinearLayout layoutGrafica = null;
	boolean anual = false;
	//################
	
	public String titulo = "";
	public int flagTiempo = 0; // 1=mes && 2=trimenstre && 3=anno
	public int flagLima = 0;
	public int flagProvincia = 0;
	public int flagNivel=0; 
	public int flagTop=0;
	public int flagBottom=0;
	public String strLima="";
	public String strProvincias="";
	public String strRanking="";
	public int flagFechaInicio=0; 
	public int flagFechaFin=0;
	public int flagMuestraOp=0;
	public int idSubTipoEvento=0;
	public String nombreUser="";
	
	private Button pickDateInicio;
    private int anhoInicio;
    private int mesInicio;
    private int diaInicio;
    
    private Button pickDateFin;
    private int anhoFin;
    private int mesFin;
    private int diaFin;
    
    int anho=0;
    int mes=0;
    int dia=0;
    
    static final int DATE_DIALOG_Inicial = 0;
    static final int DATE_DIALOG_Final = 1;
    
    private TextView mDateDisplayInicio,mDateDisplayFin;
    
	public String idPromotor=null;
	private int idperfil;
	
	/**
	 * @see android.app.Activity#onCreate(Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mas_vendidos);
		
		nombreUser = this.getIntent().getExtras().getString("nombreUser");
		idPromotor = this.getIntent().getExtras().getString("idPromotor");
		idperfil = this.getIntent().getExtras().getInt("idperfil");
		idSubTipoEvento= Integer.parseInt(this.getIntent().getExtras().getString("idSubTipo"));
				
		Resources res = getResources();
		Drawable myImage = res.getDrawable(R.drawable.background2);
		ActionBar actionBar = this.getActionBar();
		actionBar.setBackgroundDrawable(myImage);
		actionBar.setDisplayUseLogoEnabled(true);
		actionBar.setDisplayShowTitleEnabled(true);
		actionBar.setTitle(nombreUser);
		
		
		mDateDisplayInicio = (TextView) findViewById(R.id.textView2);
		mDateDisplayFin = (TextView) findViewById(R.id.textView3);
		
		pickDateInicio = (Button) findViewById(R.id.btnInicio);

		pickDateInicio.setOnClickListener(new View.OnClickListener() {
		            public void onClick(View v) {
		                showDialog(DATE_DIALOG_Inicial);
		            }
		        });
		        
		final Calendar c = Calendar.getInstance();
		anhoInicio = c.get(Calendar.YEAR);
		mesInicio = c.get(Calendar.MONTH);
		diaInicio = c.get(Calendar.DAY_OF_MONTH);
		mDateDisplayInicio.setText((mesInicio +1) + "-"+ diaInicio + "-"+ anhoInicio);
		
		pickDateFin = (Button) findViewById(R.id.btnFin);

		pickDateFin.setOnClickListener(new View.OnClickListener() {
		            public void onClick(View v) {
		                showDialog(DATE_DIALOG_Final);
		            }
		        });
		        
		anhoFin = c.get(Calendar.YEAR);
		mesFin = c.get(Calendar.MONTH);
		diaFin = c.get(Calendar.DAY_OF_MONTH);
		mDateDisplayFin.setText((mesFin +1) + "-"+ diaFin + "-"+ anhoFin);
		
		graficaInicial(null);
	}
	
	/*** ACTION BAR ***/
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menuprincipal, menu);
        return true; 
    }
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
	    // Handle item selection
	    switch (item.getItemId()) {
	        case R.id.logout:
	        	Intent logo = new Intent(this,login.class);
	        	startActivity(logo);
	            return true;
	        case android.R.id.home:
	        	if(flagMuestraOp==1) ocultarMenu();
	        	else mostrarMenu();	        	
	        	return true;
	        case R.id.menuPrincipal:
	        	Intent menu = new Intent(this,com.Generales.Menu.class);
	        		        	
	        	menu.putExtra("codigo","");
	        	menu.putExtra("nombreUser",nombreUser);
	        	menu.putExtra("idPromotor",idPromotor);
	        	menu.putExtra("idperfil", idperfil);
	        	startActivity(menu);
	            return true; 
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}	
	
	
	
	protected Dialog onCreateDialog(int id) {
		   switch (id) {
		   case DATE_DIALOG_Inicial:
		    DatePickerDialog dialogoInicio =new DatePickerDialog(this,
		                    mDateSetListenerInicio, anhoInicio, mesInicio, diaInicio);
		    
		    dialogoInicio.getDatePicker();
			   
		    return dialogoInicio;
		    
		   case DATE_DIALOG_Final:
			    DatePickerDialog dialogoFin =new DatePickerDialog(this,
			                    mDateSetListenerFin, anhoFin, mesFin, diaFin);
			    
			    dialogoFin.getDatePicker();
		   
		    return dialogoFin;
		   }
		   return null;
	}
	
	private DatePickerDialog.OnDateSetListener mDateSetListenerInicio = new DatePickerDialog.OnDateSetListener() {
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        	anhoInicio = year;
        	mesInicio = monthOfYear;
        	diaInicio = dayOfMonth;
        	establecerColorFechaInicio();
        	
        	mDateDisplayInicio.setText(new StringBuilder()
			// Month is 0 based so add 1
            .append(mesInicio + 1).append("-")
            .append(diaInicio).append("-")
            .append(anhoInicio).append(" "));
        }
	};
	
	private DatePickerDialog.OnDateSetListener mDateSetListenerFin = new DatePickerDialog.OnDateSetListener() {
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        	anhoFin = year;
        	mesFin = monthOfYear;
        	diaFin = dayOfMonth;
        	establecerColorFechaFin();
        	
        	mDateDisplayFin.setText(new StringBuilder()
			// Month is 0 based so add 1
            .append(mesFin + 1).append("-")
            .append(diaFin).append("-")
            .append(anhoFin).append(" "));        	
        }
	};
	
	
	public void graficaInicial (View view){
    	double[] auxDatos = {0};    	
    	List<double[]> datosBarra = new ArrayList<double[]>();
    	datosBarra.add(auxDatos);
    	
    	double[] auxDatos3 = {};
    	List<double[]> datosLine = new ArrayList<double[]>();
    	datosLine.add(auxDatos3);
    	
    	String [] datosEventos = new String[0];
    	
    	barra_linea_RepMasVendidos grafica = new barra_linea_RepMasVendidos();
    	grafica.execute(datosBarra,datosLine,datosEventos,"Reporte de los SubTipos de Eventos mas vendidos");
    	
    	String [] types = {BarChart.TYPE, LineChart.TYPE};
    	
    	GraphicalView mChartview;
		LinearLayout layout = (LinearLayout) findViewById(R.id.idpanelgraficoconsulta);
		
		XYMultipleSeriesRenderer renderer = grafica.getmRenderer();
		renderer.getSeriesRendererAt(0).setDisplayChartValues(false);
		
		mChartview = ChartFactory.getCombinedXYChartView(this, grafica.getDataSet(), grafica.getmRenderer(), types);
		layout.removeAllViews();
		layout.addView(mChartview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    }
	

	public void ocultarMenu(){
		LinearLayout auxLayout=(LinearLayout)findViewById(R.id.LinearLayout01);
		auxLayout.setVisibility(View.GONE);
		flagMuestraOp=0;
	}
	
	
	public void mostrarMenu(){
		LinearLayout auxLayout=(LinearLayout)findViewById(R.id.LinearLayout01);
		auxLayout.setVisibility(View.VISIBLE);
		flagMuestraOp=1;
	}
	
	
	
	public void GenerarReporte(View view){			
		
		int numeroInicial = anhoInicio*10000+mesInicio*100+diaInicio;
		int numeroFinal = anhoFin*10000+mesFin*100+diaFin;
		
		Calendar cal = Calendar.getInstance();
		anho = cal.get(Calendar.YEAR);
		mes = cal.get(Calendar.MONTH);
		dia = cal.get(Calendar.DAY_OF_MONTH);
		int numeroActual = anho*10000+mes*100+dia;
		
		//Toast.makeText(this, "La fecha Actual: "+numeroActual+" La fecha final: "+numeroFinal, Toast.LENGTH_LONG).show();
		
		if ( !(strProvincias.isEmpty() && strLima.isEmpty()) ) {
		
			if(numeroFinal>=numeroInicial){
				
				if (numeroFinal<=numeroActual){
				//Titulo de la Grafica
				this.tituloGrafica = "Reporte de los SubTipos de Eventos mas vendidos";
				
				
				String urlVent = "";
				
				urlVent = urlMasVendidos;				
				urlVent += anhoInicio + "-" + mesInicio + "-" + diaInicio + "/" + 
						   anhoFin + "-" + mesFin + "-" + diaFin + "/";				
				urlVent += idSubTipoEvento + ".json";
				
				
				auxJsonVentas = returnJson(urlVent);
				
				if (auxJsonVentas != null){
				
					if ((auxJsonVentas.length() != 0)){
					
						db = new BD_RM(this);
						db.borraTablaVentas();
				
						ArrayList<Registro_MasVendidos> arrayVenta = new ArrayList<Registro_MasVendidos>();
				
						//Llenamos la BD SQLite
						try {
							for(int i = 0; i < auxJsonVentas.length(); i++){
								JSONObject jsonItem = auxJsonVentas.getJSONObject(i);
								JSONObject jsonItem1 = jsonItem.getJSONObject("fact_venta");
				         
								String nomEvento = jsonItem1.getString("Evento"); //VALIDAR EL NOMBRE CON LO QUE APARECE EN INTERNET
								String ubicacion = jsonItem1.getString("Ubicacion");		         
								int  cantidad = jsonItem1.getInt("Cantidad");
				         
								Registro_MasVendidos regVenta = new Registro_MasVendidos (nomEvento, ubicacion, cantidad);				         
								arrayVenta.add(regVenta);
							}
						}catch (JSONException e) {
							e.printStackTrace();
						}
				
						//arrayRe = getVentas(idEvento); //se llena el arry con data del json		
						for (int i =0; i < arrayVenta.size();i++){//se agregan las ventas a la BD
							db.addRegistroVentas(arrayVenta.get(i));
						}
				
				
				
						ArrayList<Registro_MasVendidos> listaMasVendidos = new ArrayList<Registro_MasVendidos>();
						listaMasVendidos = db.getVentas(strLima, strProvincias, strRanking, flagTiempo);
				
						if (listaMasVendidos!=null){
					
							double[] registrosBarra = new double[listaMasVendidos.size()];
							String[] registrosEventos = new String[listaMasVendidos.size()]; //Nombre de los eventos
							for(int i=0; i<listaMasVendidos.size(); i++){
								registrosBarra[i] = listaMasVendidos.get(i).getCantidad();
								registrosEventos[i] = listaMasVendidos.get(i).getNomEvento();
							}
							db.close();
					
							List<double[]> datosBarra = new ArrayList<double[]>();								
							datosBarra.add(registrosBarra);
			  					
					
							double[] auxDatos3 = {};
							List<double[]> datosLine = new ArrayList<double[]>();
							datosLine.add(auxDatos3);
	    	
							barra_linea_RepMasVendidos grafica = new barra_linea_RepMasVendidos();				
							grafica.execute(datosBarra,datosLine,registrosEventos,this.tituloGrafica);
	    	
							String [] types = {BarChart.TYPE, LineChart.TYPE};
	    	
							GraphicalView mChartview;
							mChartview = ChartFactory.getCombinedXYChartView(this, grafica.getDataSet(), grafica.getmRenderer(), types);
			
							LinearLayout layout = (LinearLayout) findViewById(R.id.idpanelgraficoconsulta);
							layout.removeAllViews();
							layout.addView(mChartview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
					
							ocultarMenu();
				
						}else
							Toast.makeText(this, "No hay datos para mostrar", Toast.LENGTH_LONG).show();				
					}else
						Toast.makeText(this, "No hay datos para mostrar", Toast.LENGTH_LONG).show();					
				}else
					Toast.makeText(this, "Problemas con la conexion", Toast.LENGTH_LONG).show();
				
				}else					
				Toast.makeText(this, "La Fecha Final no puede ser mayor a la Fecha Actual", Toast.LENGTH_LONG).show();
			}else				
				Toast.makeText(this, "La Fecha Final no puede ser menor a la Fecha Inicial", Toast.LENGTH_LONG).show();
			
		}else			
			Toast.makeText(this, "Debe seleccionar el periodo y la ubicacion", Toast.LENGTH_LONG).show();
		
		
		
	}
	
	private JSONArray returnJson(String url) {
		JSONArray array = null;
		try {
			array = (new JSONParser_Final().execute(url)).get(); //SE OBTIENE LOS OBJ DEL JSON
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return array;
	}
	
	
	public void establecerColorFechaInicio(){		
		Button btnInicio = (Button) findViewById(R.id.btnInicio);
				
		Drawable d1 = btnInicio.getBackground();
	    PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
	    d1.setColorFilter(filter);			
	    
	    this.setFlagFechaInicio(1);
	}
	
	
	public void establecerColorFechaFin(){		
		Button btnFin = (Button) findViewById(R.id.btnFin);
		
		Drawable d1 = btnFin.getBackground();
        PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
        d1.setColorFilter(filter);
		
        this.setFlagFechaFin(1);
	}

	public void establecerColorLargoMuestra(View view){		
		
		Button button03 = (Button) findViewById(R.id.btn03);
		Button button05 = (Button) findViewById(R.id.btn05);
		Button button10 = (Button) findViewById(R.id.btn10);
	
		if (button03.isPressed()){
						
			flagTiempo=3;
			Drawable d1 = button03.getBackground();
            PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
            d1.setColorFilter(filter);
						
			Drawable d2 = button05.getBackground();
            findViewById(R.id.btn05).invalidateDrawable(d2);
            d2.clearColorFilter();
			
            Drawable d3 = button10.getBackground();
            findViewById(R.id.btn10).invalidateDrawable(d3);
            d3.clearColorFilter();
		}
		
		if (button05.isPressed()){			
			anual = true;
			Drawable d1 = button05.getBackground();
            PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
            d1.setColorFilter(filter);
			
			Drawable d2 = button03.getBackground();
            findViewById(R.id.btn03).invalidateDrawable(d2);
            d2.clearColorFilter();
			
            Drawable d3 = button10.getBackground();
            findViewById(R.id.btn10).invalidateDrawable(d3);
            d3.clearColorFilter();
            
			flagTiempo=5;
		}
		
		if (button10.isPressed()) {
			
			anual = false;
			Drawable d1 = button10.getBackground();
            PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
            d1.setColorFilter(filter);
			
			Drawable d2 = button03.getBackground();
            findViewById(R.id.btn03).invalidateDrawable(d2);
            d2.clearColorFilter();
			
            Drawable d3 = button05.getBackground();
            findViewById(R.id.btn05).invalidateDrawable(d3);
            d3.clearColorFilter();
            
			flagTiempo=10;			
		}
	}

	
	
	public void establecerColorUbicacion(View view){	

		Button buttonLima = (Button) findViewById(R.id.btnLima);
		Button buttonProvincia = (Button) findViewById(R.id.btnProvincia);
        
        if (buttonLima.isPressed()){
        	if (strLima.isEmpty())  
        		strLima="Lima"; 
        	else 
        		strLima="";
		}
		if (buttonProvincia.isPressed()){			
			if(strProvincias.isEmpty()) 
				strProvincias="Provincias"; 
			else 
				strProvincias="";
		}		
		setColorUbicacion();
	}
	
	
	public void setColorUbicacion(){
		
		Button buttonLima = (Button) findViewById(R.id.btnLima);
		Button buttonProvincia = (Button) findViewById(R.id.btnProvincia);
				
        if (!strLima.isEmpty()) {        		
        	Drawable d1 = buttonLima.getBackground();
            PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
            d1.setColorFilter(filter);
    	}
    	else{
    		Drawable d2 = buttonLima.getBackground();
            findViewById(R.id.btnLima).invalidateDrawable(d2);
            d2.clearColorFilter();
    	}

		if(!strProvincias.isEmpty()){			
			Drawable d1 = buttonProvincia.getBackground();
            PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
            d1.setColorFilter(filter);			
		}
		else{            
			Drawable d2 = buttonProvincia.getBackground();
            findViewById(R.id.btnProvincia).invalidateDrawable(d2);
            d2.clearColorFilter();           
		}
	}

	
	//Dividir en Top y otro para Bottom
	public void establecerColorRanking(View view){	

		Button buttonTop = (Button) findViewById(R.id.btnTop);
		Button buttonBottom = (Button) findViewById(R.id.btnBottom);
        
        
		if (buttonTop.isPressed()){
						
			if (strRanking.equals("Bottom")){
				Drawable d2 = buttonBottom.getBackground();
	            findViewById(R.id.btnBottom).invalidateDrawable(d2);
	            d2.clearColorFilter();	            
			}
			
			if (strRanking.equals("Top")){
				Drawable d2 = buttonTop.getBackground();
                findViewById(R.id.btnTop).invalidateDrawable(d2);
                d2.clearColorFilter();
                strRanking="";
			}else{
				Drawable d1 = buttonTop.getBackground();
                PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
                d1.setColorFilter(filter);                
                strRanking="Top";
			}
		}
        
		if (buttonBottom.isPressed()){			
			
			if (strRanking.equals("Top")){
				Drawable d2 = buttonTop.getBackground();
	            findViewById(R.id.btnBottom).invalidateDrawable(d2);
	            d2.clearColorFilter();	            
			}
			
			if (strRanking.equals("Bottom")){
				Drawable d2 = buttonBottom.getBackground();
                findViewById(R.id.btnTop).invalidateDrawable(d2);
                d2.clearColorFilter();
                strRanking="";
			}else{
				Drawable d1 = buttonBottom.getBackground();
                PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
                d1.setColorFilter(filter);
                strRanking="Bottom";
			}
		}		
	}


	
	public String getDataXY(String[] data, int[] xValues, int[] yValues, int x, int y){
    	int indice = 0;
    	
    	for(int i=0;i<xValues.length;i++){
    		indice= i;
    		if (xValues[i] == x && yValues[i] == y)
    			break;
    	}
    	
    	return data[indice];
    }

	public int getFlagFechaInicio() {
		return flagFechaInicio;
	}

	public void setFlagFechaInicio(int flagFechaInicio) {
		this.flagFechaInicio = flagFechaInicio;
	}

	public int getFlagFechaFin() {
		return flagFechaFin;
	}

	public void setFlagFechaFin(int flagFechaFin) {
		this.flagFechaFin = flagFechaFin;
	}
	
	
		
}
